/***************************************************************************************************
 *Copyright(C),2010-2017,Sumscope
 *FileName	:  pinyin_search.h
 *Author	:  scofined.qi
 *Version	:  1.0
 *Date		:  2017/06/04
 *Desc		:  //用于主要说明此程序文件完成的主要功能
 *Relation :
 *Others	:  //其他内容说明
 *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
 *History	:
 * //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
 ***************************************************************************************************/
#pragma once

#include "../core.h"
#include "./pinyin/pinyin_search_define.h"

namespace internal {
class BondChangeBuffer;
}
namespace qb {
namespace base {
enum kChangeType {
  kChangeTypeNone,
  kChangeTypeName,        // 包含拼音,拼音需要自动计算
  kChangeTypeCode,        // Code,代码
  kChangeTypeNameOnly,    // 只有名称,拼音通过外面传递
  kChangeTypePinyin,      // 简拼
  kChangeTypePinyinFull,  // 全拼
  kChangeTypeNameEn,      // 英文简称
  kChangeTypeCount,
};
class S_CORE_EXPORT SpellSearch {
 public:
  class S_CORE_EXPORT Collector {
    void* m_buffer;
    int m_count;
    bool m_build;
    bool m_diskless;

   public:
    Collector(bool build = false);
    ~Collector();
    void SetDiskless(bool diskless) { m_diskless = diskless; }
    void SetBuild(bool build) { m_build = build; }
    void AddNameChange(int id, const char* oldName, int oldlen,
                       const char* name, int len);
    void AddNameEnChange(int id, const char* oldName, int oldlen,
                         const char* name, int len);
    void AddCodeChange(int id, const char* oldCode, int oldlen,
                       const char* code, int len);
    void AddChange(int id, int type, const char* oldName, int oldlen,
                   const char* name, int len);
    void Commit();
    int GetCount() const { return m_count; }

   protected:
    void* GetBuffer();
  };
  typedef ISpellSearchListener Listener;
  // class SSBASE_API Listener:public internal::ISpellSearchListener{
  // public:
  //	virtual void OnResult(const int* ids, int ncount){}
  // };
  enum kEngineType {
    kEngineTypeRefactor,
    kEngineTypeMerged,
  };

 public:
  static void GetPinyinBuffer(const wchar_t* buffer, int len, wchar_t* quanbuf,
                              int& quanlen, wchar_t* jianbuf, int& jianlen);
  static void GetAllKeys(std::vector<std::wstring>& keys);
  static void FindBonds(const std::wstring& text, Listener* listener);
  static void FindBonds(unsigned short const* text, int len,
                        Listener* listener);
};
}  // namespace base
}  // namespace qb
